package com.codi.fcloud.ufx.hssale.query;

import com.codi.base.log.annotation.Loggable;
import com.codi.base.util.ExceptionUtil;
import com.codi.base.util.StringUtil;
import com.codi.bus.constant.GlobalConstant;
import com.codi.bus.exception.HundsunAPIException;
import com.codi.fcloud.ufx.UfxSDKFactory;
import com.codi.fcloud.ufx.constant.HSInputParameterNames;
import com.codi.fcloud.ufx.constant.UrlConstants;
import com.codi.trade.dto.HsShareQueryDto;
import com.codi.trade.service.ShareQueryService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

@Service("shareQueryService")
public class ShareQuery extends UfxSDKFactory implements ShareQueryService {

    // 份额查询
    @Loggable
    @Override
    public Map<String, Object> query(Integer requestNum, Integer queryflag, Integer beginNum, String tradeAccount,
                                     String sortDirection, String taAccount, String fundCode, String shareType, String clientId, String fundType,
                                     String bankNo, BigDecimal totalShare) {

        try {

            // 获取第一页
            Map<String, Object> request = getRequestParams(requestNum, queryflag, beginNum, tradeAccount, sortDirection,
                taAccount, fundCode, shareType, clientId, fundType, bankNo, totalShare);

            List<Map<String, Object>> response = getUfxSDK().query(getTarget(), request);

            // 如果requestNum是我们系统定义的最大值，则表明数据需要全部取出来
            getNextResponse(request, response, requestNum);

            return appendLog(request, response);
        } catch (Exception exception) {
            ExceptionUtil.logError(logger, getTarget(), exception);
            throw new HundsunAPIException(ExceptionUtil.getMessage(exception));
        }
    }

    @Override
    @Loggable
    public Map<String, Object> query(HsShareQueryDto dto) {
        try {
            Map<String, Object>       request  = getRequestParams(dto);
            List<Map<String, Object>> response = getUfxSDK().query(getTarget(), request);

            // 如果requestNum是我们系统定义的最大值，则表明数据需要全部取出来
            getNextResponse(request, response, dto.getRequest_num());

            return appendLog(request, response);
        } catch (Exception exception) {
            ExceptionUtil.logError(logger, getTarget(), exception);
            throw new HundsunAPIException(ExceptionUtil.getMessage(exception));
        }
    }

    /**
     * 获取请求参数
     *
     * @param requestNum
     * @param queryflag
     * @param beginNum
     * @param tradeAccount
     * @param sortDirection
     * @param taAccount
     * @param fundCode
     * @param shareType
     * @param clientId
     * @param fundType
     * @param bankNo
     * @param totalShare
     * @return
     */
    private Map<String, Object> getRequestParams(Integer requestNum, Integer queryflag, Integer beginNum,
                                                 String tradeAccount, String sortDirection, String taAccount, String fundCode, String shareType,
                                                 String clientId, String fundType, String bankNo, BigDecimal totalShare) {
        String trustWay = apiValueMap.get(HSInputParameterNames.TRUST_WAY);

        Map<String, Object> request = new HashMap<String, Object>();
        request.put("trust_way", trustWay); // 交易委托方式
        request.put("request_num", requestNum); // 请求行数
        // 如果重新统计总记录数标志传0, 返回值 total_count值为空，传1就返回总记录数
        request.put("reqry_recordsum_flag", queryflag); // 重新统计总记录数标志
        request.put("qry_beginrownum", beginNum); // 查询起始行号
        request.put("sort_direction", sortDirection); // 返回排序方式
        request.put("trade_acco", StringUtil.isEmpty(tradeAccount) ? "" : tradeAccount); // 交易帐号
        request.put("ta_acco", taAccount); // TA账号
        request.put("client_id", StringUtil.isEmpty(clientId) ? "" : clientId); // 客户编号
        request.put("fund_code", StringUtil.isEmpty(fundCode) ? "" : fundCode); // 基金代码
        request.put("share_type", shareType); // 份额分类
        request.put("ofund_type", fundType); // 基金类型
        request.put("bank_no", bankNo); // 银行代码
        // HS:这个是有家客户特殊用的 正常情况下都没用
        request.put("trade_source", ""); // 交易来源
        // 这个字段是过滤用的 如total_share=0.01 那么份额为0的份额记录都不会查询出来
        request.put("total_share", totalShare == null ? "" : totalShare); // 份额

        return request;
    }

    private Map<String, Object> getRequestParams(HsShareQueryDto dto) {

        String trustWay = apiValueMap.get(HSInputParameterNames.TRUST_WAY);

        Map<String, Object> request = new HashMap<>();

        request.put("trust_way", trustWay); // 交易委托方式
        request.put("request_num", Objects.equals(getInteger(dto.getRequest_num(), 50), GlobalConstant.MAX_REQUEST_NUM) ? 50: getInteger(dto.getRequest_num(), 50)); //	N8	请求行数	Y	最大不能超过50；即最大返回记录条数不对查过50条；
        // 如果重新统计总记录数标志传0, 返回值 total_count值为空，传1就返回总记录数
        //	C1	重新统计总记录数标志	N	0-不重新统计；1-重新统计；
        request.put("reqry_recordsum_flag", getString(dto.getReqry_recordsum_flag(), "1"));
        //	N8	查询起始行号	N	比如总记录是100，每50条分页；那么需要查询2次；第1次查询请求行数传50，
        request.put("qry_beginrownum", getInteger(dto.getQry_beginrownum(), 1)); // 查询起始行号
        request.put("sort_direction", getString(dto.getSort_direction(), "1")); //	C1	返回排序方式	N
        //	C17	交易账号	N	交易账号、客户编号至少有一个为必填项
        request.put("trade_acco", getString(dto.getTrade_acco())); // 交易帐号
        request.put("ta_acco", getString(dto.getTa_acco())); // TA账号
        request.put("client_id", getString(dto.getClient_id())); // 客户编号
        request.put("fund_code", getString(dto.getFund_code())); // 基金代码
        request.put("share_type", getString(dto.getShare_type())); // 份额分类
        request.put("bank_no", getString(dto.getBank_no())); // 银行代码
        // HS:这个是有家客户特殊用的 正常情况下都没用
        request.put("trade_source", getString(dto.getTrade_source())); // 交易来源
        // 这个字段是过滤用的 如total_share=0.01 那么份额为0的份额记录都不会查询出来
        request.put("total_share", getString(dto.getTotal_share())); // 份额
        request.put("ofund_type", getString(dto.getOfund_type())); // 基金类型
        request.put("trade_source_uneq", getString(dto.getTrade_source_uneq()));//	C12	交易来源<>	N
        request.put("private_flag", getString(dto.getPrivate_flag()));//	C1	是否为私募基金	N	0-否；1-是
        request.put("special_trade_acco", getString(dto.getSpecial_trade_acco()));//	C17	特殊交易账号	N	查询超级现金宝时使用

        return request;
    }


    @Override
    protected String getTarget() {
        return UrlConstants.PREFIX_SALE + UrlConstants.SHARE_QRY;
    }

}
